c programming patterns